JWT (JSON Web Token) Authentication ব্যবহারের সময়, Token Expiration এবং Refresh Token তৈরি করা গুরুত্বপূর্ণ বিষয় হয়ে দাঁড়ায়। JWT-তে একটি নির্দিষ্ট সময়সীমা থাকে, যার পর টোকেনটির বৈধতা শেষ হয়ে যায় (Expiration)। তখন ব্যবহারকারীকে পুনরায় লগইন করতে হতে পারে বা Refresh Token ব্যবহার করে নতুন টোকেন পাওয়া যায়। এই প্রক্রিয়াগুলি Spring Security-তে কিভাবে কনফিগার করতে হয় তা আলোচনা করা হবে।
Token Expiration Management
JWT-এর expiration ফিল্ড ব্যবহারকারীকে একটি টোকেনের বৈধতার সময়সীমা নির্ধারণ করতে সাহায্য করে। যখন টোকেনটির সময়সীমা শেষ হয়, তখন এটি আর বৈধ থাকে না এবং ব্যবহারকারীকে পুনরায় অথেনটিকেট হতে হয়।
1. JWT Token এর Expiration সেট করা:
JWT Token তৈরি করার সময়, আপনি exp (expiration) প্যারামিটার ব্যবহার করতে পারেন। এই প্যারামিটারটি সাধারণত একটি সময় (epoch time) প্রকাশ করে, যার পরে টোকেনটি মেয়াদ উত্তীর্ণ হয়ে যাবে।
উদাহরণ:
import io.jsonwebtoken.*;
import java.util.Date;
public class JwtUtil {
private final String SECRET_KEY = "your-256-bit-secret-key";
private final long EXPIRATION_TIME = 1000 * 60 * 60 * 10; // 10 hours
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // Set expiration
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public boolean isTokenExpired(String token) {
return getExpirationDateFromToken(token).before(new Date());
}
public Date getExpirationDateFromToken(String token) {
return Jwts.parserBuilder()
.setSigningKey(SECRET_KEY)
.build()
.parseClaimsJws(token)
.getBody()
.getExpiration();
}
}
setExpiration: Token এর Expiration Time নির্ধারণ করে।isTokenExpired: Token মেয়াদ শেষ হয়েছে কিনা চেক করার জন্য ব্যবহৃত হয়।
2. Token Expiration যাচাই:
JWT এর Expiration যাচাই করার জন্য, আপনি isTokenExpired ফাংশন ব্যবহার করতে পারেন। যদি Expiration এর পরে রিকোয়েস্ট আসে, তবে টোকেন অবৈধ হিসেবে গণ্য হবে এবং পুনরায় লগইন করতে হবে।
Refresh Token Generation
JWT-র Access Token সাধারণত ছোট সময়ের জন্য মেয়াদী থাকে। যদি ব্যবহারকারী লগইন করার পর টোকেনটি মেয়াদোত্তীর্ণ হয়ে যায়, তাহলে Refresh Token ব্যবহার করে নতুন একটি Access Token তৈরি করা যেতে পারে। Refresh Token দীর্ঘমেয়াদী এবং এর মাধ্যমে নতুন Access Token জেনারেট করা যায়।
Refresh Token Generation কনফিগারেশন:
1. Refresh Token Class:
Refresh Token তৈরি করার জন্য আপনাকে একটি নতুন টোকেন তৈরির পদ্ধতি তৈরি করতে হবে, যেটি দীর্ঘমেয়াদী এবং এটি Token Expiration পর পুনরায় একটি নতুন Access Token ইস্যু করবে।
import io.jsonwebtoken.*;
import java.util.Date;
public class JwtUtil {
private final String SECRET_KEY = "your-256-bit-secret-key";
private final long ACCESS_TOKEN_EXPIRATION = 1000 * 60 * 15; // 15 minutes
private final long REFRESH_TOKEN_EXPIRATION = 1000 * 60 * 60 * 24 * 7; // 7 days
// Generate Access Token
public String generateAccessToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + ACCESS_TOKEN_EXPIRATION))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
// Generate Refresh Token
public String generateRefreshToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + REFRESH_TOKEN_EXPIRATION))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
// Check if the Access Token is expired
public boolean isTokenExpired(String token) {
return getExpirationDateFromToken(token).before(new Date());
}
public Date getExpirationDateFromToken(String token) {
return Jwts.parserBuilder()
.setSigningKey(SECRET_KEY)
.build()
.parseClaimsJws(token)
.getBody()
.getExpiration();
}
public String extractUsername(String token) {
return Jwts.parserBuilder()
.setSigningKey(SECRET_KEY)
.build()
.parseClaimsJws(token)
.getBody()
.getSubject();
}
}
Explanation:
generateAccessToken: এই ফাংশনটি ১৫ মিনিটের জন্য Access Token তৈরি করবে।generateRefreshToken: এই ফাংশনটি ৭ দিনের জন্য Refresh Token তৈরি করবে।
Step 2: Refresh Token API
একটি API তৈরি করতে হবে যা Refresh Token গ্রহণ করে এবং নতুন Access Token প্রদান করবে। যখন একটি Access Token মেয়াদোত্তীর্ণ হয়ে যাবে, তখন Refresh Token ব্যবহার করে নতুন Access Token জেনারেট করা হবে।
Refresh Token API উদাহরণ:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
public class AuthController {
@Autowired
private JwtUtil jwtUtil;
@PostMapping("/login")
public String login(@RequestBody AuthRequest authRequest) {
// Here you authenticate the user (omitting for brevity)
String accessToken = jwtUtil.generateAccessToken(authRequest.getUsername());
String refreshToken = jwtUtil.generateRefreshToken(authRequest.getUsername());
return "Access Token: " + accessToken + ", Refresh Token: " + refreshToken;
}
@PostMapping("/refresh-token")
public String refreshToken(@RequestBody RefreshTokenRequest refreshTokenRequest) {
String refreshToken = refreshTokenRequest.getRefreshToken();
// Verify the refresh token
if (jwtUtil.isTokenExpired(refreshToken)) {
throw new RuntimeException("Refresh token expired");
}
String username = jwtUtil.extractUsername(refreshToken);
String newAccessToken = jwtUtil.generateAccessToken(username);
return "New Access Token: " + newAccessToken;
}
}
class AuthRequest {
private String username;
private String password;
// Getters and Setters
}
class RefreshTokenRequest {
private String refreshToken;
// Getter and Setter
}
Explanation:
- /login API: লগইন করলে Access Token এবং Refresh Token দেওয়া হবে।
- /refresh-token API: ব্যবহারকারী যখন Access Token নিয়ে রিকোয়েস্ট করবেন এবং টোকেনটি যদি মেয়াদোত্তীর্ণ হয়ে থাকে, তবে Refresh Token ব্যবহার করে নতুন Access Token প্রদান করা হবে।
Step 3: Token Expiration Management
- Access Token Expiration: সাধারণত ছোট সময়সীমার জন্য Access Token তৈরি করা হয়। এই টোকেনটি ব্যবহারকারী লগইন করার পর কিছু সময়ের জন্য বৈধ থাকবে (যেমন ১৫ মিনিট)।
- Refresh Token Expiration: Refresh Token দীর্ঘমেয়াদী থাকে (যেমন ৭ দিন) এবং এটি ব্যবহার করে নতুন Access Token জেনারেট করা যায়।
- Token Validation: Expired Token চেক করা হয়। যদি Token মেয়াদোত্তীর্ণ হয়ে যায়, তাহলে Refresh Token ব্যবহার করে নতুন Token জেনারেট করতে হবে।
উপসংহার:
Spring Security-তে Token Expiration এবং Refresh Token Generation এর মাধ্যমে আপনি JWT Authentication-কে আরো নিরাপদ এবং ব্যবহারকারী-বান্ধব করতে পারেন।
- Access Token ছোট সময়ের জন্য ব্যবহৃত হয় এবং Refresh Token দীর্ঘমেয়াদী।
- যখন Access Token মেয়াদোত্তীর্ণ হয়, তখন Refresh Token ব্যবহার করে নতুন Access Token জেনারেট করা যায়।
- JWT Utility ক্লাস এবং Refresh Token API তৈরি করে আপনি সহজে এই ফিচারটি ইনটিগ্রেট করতে পারেন।
Read more